package com.wrx.util;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

/**
 * Swing 组件工具类
 * 提供常用的 UI 组件创建和操作方法
 */
public class SwingComponentUtil {

    /**
     * 创建只读的日志文本区域（带滚动条）
     */
    public static JScrollPane createLogArea(JTextArea logArea) {
        logArea.setEditable(false);
        logArea.setLineWrap(true);
        logArea.setWrapStyleWord(true);
        return new JScrollPane(logArea);
    }

    /**
     * 打开文件选择对话框（默认桌面路径）
     * @param parent 父组件
     * @param filePathField 文件路径显示字段
     * @param logArea 日志区域
     */
    public static void openFileChooser(Component parent, JTextField filePathField, JTextArea logArea) {
        JFileChooser chooser = SwingComponentUtil.getDesktopFileChooser();
        int result = chooser.showOpenDialog(parent);
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();
            filePathField.setText(file.getAbsolutePath());
            logArea.append("✅ 已选择文件：" + file.getName() + "\n");
        }
    }

    /**
     * 保存文件对话框
     * @param parent 父组件
     * @param content 要保存的内容
     * @param defaultFileName 默认文件名
     * @param logArea 日志区域
     */
    public static void saveFileDialog(Component parent, String content, String defaultFileName, JTextArea logArea) {
        JFileChooser saveChooser = SwingComponentUtil.getDesktopFileChooser();
        saveChooser.setDialogTitle("选择保存位置");
        saveChooser.setSelectedFile(new File(defaultFileName));

        int userSelection = saveChooser.showSaveDialog(parent);
        if (userSelection == JFileChooser.APPROVE_OPTION) {
            try {
                File outFile = saveChooser.getSelectedFile();
                // 使用 UTF-8 编码保存文件
                Files.write(outFile.toPath(), content.getBytes(StandardCharsets.UTF_8));
                logArea.append("💾 文件已保存：" + outFile.getAbsolutePath() + "\n");
                logArea.setCaretPosition(logArea.getDocument().getLength());
                logArea.repaint();
            } catch (Exception e) {
                logArea.append("❌ 保存失败：" + e.getMessage() + "\n");
                logArea.setCaretPosition(logArea.getDocument().getLength());
                logArea.repaint();
            }
        } else {
            logArea.append("❎ 已取消保存\n");
            logArea.setCaretPosition(logArea.getDocument().getLength());
            logArea.repaint();
        }
    }

    /**
     * 确认保存对话框
     * @param parent 父组件
     * @param content 要保存的内容
     * @param defaultFileName 默认文件名
     * @param logArea 日志区域
     */
    public static void confirmAndSave(Component parent, String content, String defaultFileName, JTextArea logArea) {
        int save = JOptionPane.showConfirmDialog(parent, 
            "是否保存生成的 SQL 到文件？", 
            "保存", 
            JOptionPane.YES_NO_OPTION);
        
        if (save == JOptionPane.YES_OPTION) {
            saveFileDialog(parent, content, defaultFileName, logArea);
        }
    }

    /**
     * 验证文件是否存在
     * @param filePath 文件路径
     * @param logArea 日志区域
     * @return 文件对象，如果不存在返回 null
     */
    public static File validateFile(String filePath, JTextArea logArea) {
        File file = new File(filePath);
        if (!file.exists()) {
            logArea.append("❌ 文件不存在: " + filePath + "\n");
            return null;
        }
        return file;
    }

    /**
     * 创建带标题的输入面板
     * @param title 面板标题
     * @param rows 行数
     * @param cols 列数
     * @return 输入面板
     */
    public static JPanel createInputPanel(String title, int rows, int cols) {
        JPanel panel = new JPanel(new GridLayout(rows, cols, 5, 5));
        panel.setBorder(BorderFactory.createTitledBorder(title));
        return panel;
    }

    /**
     * 添加标签和输入框到面板
     * @param panel 目标面板
     * @param labelText 标签文本
     * @param textField 输入框
     */
    public static void addLabelAndField(JPanel panel, String labelText, JTextField textField) {
        panel.add(new JLabel(labelText));
        panel.add(textField);
    }

    /**
     * 显示错误信息
     * @param logArea 日志区域
     * @param message 错误信息
     * @param ex 异常对象
     */
    public static void logError(JTextArea logArea, String message, Exception ex) {
        logArea.append("❌ " + message + "：" + ex.getMessage() + "\n");
        logArea.setCaretPosition(logArea.getDocument().getLength());
        logArea.repaint();
        ex.printStackTrace();
    }

    /**
     * 显示成功信息
     * @param logArea 日志区域
     * @param message 成功信息
     */
    public static void logSuccess(JTextArea logArea, String message) {
        logArea.append("✅ " + message + "\n");
        logArea.setCaretPosition(logArea.getDocument().getLength());
        logArea.repaint();
    }

    public static JFileChooser getDesktopFileChooser() {
        File desktopDir = new File(System.getProperty("user.home"), "Desktop");
        return new JFileChooser(desktopDir);
    }
}

